# Сеть в kubernetes

## Kubernetes network model

Модель сети kubernetes подразумевает следующее:

* Каждый под имеет собственный IP адрес.
* Контейнеры внутри пода имеют общий IP адрес и могут свободно обмениваться пакетами друг с другом.
* Поды могут посылать пакеты другими подами в кластере, используя их IP адреса. Без применения NAT.
* Ограничения в хождении пакетов между подами определяется при помощи сетевых политик.

Таким образом, под можно представить как некую виртуальную машину со своим IP адресом. Контейнеры внутри пода, 
как приложения (процессы) в виртуальной машине, общаются друг с другом через loopback интерфейс или чере IPC.

Поскольку ограничения реализуются при помощи сетевых политик, то реализация самой сети остаётся достаточно простой.
По сути, внутри кластера kubernetes мы получаем "плоскую" сеть.

Разумеется, существует возможность отображать порты внутри пода на порты ноды кластера, а так же запускать поды в
пространстве сети хоста (например Linux).

## Реализация сети в kubernetes

В kubernetes реализована базовая сетвая модель. Но в основном используют сторониие реализации, которые подключаются 
к kubernetes с помощью API CNI (Container Network Interface). Список таких реализаций можно посмотреть в 
[документации](https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model).

### Calico

[Calico](https://www.projectcalico.org/) - это одна  из реализаций.

Calico предоставляет основные плагины:
* Сетевой, отвечающий за подключение пода к сети.
* IPAM (IP Address Management), отвечающий за выделение IP-адресов подов.

Calico может работать как самостоятельно, так и интегрироваться с другими модулями CNI.

## Сервисы

Сервисы - это абстракция, позволяющая представить приложенние горизонтально масштабированное в группе подов, как единый
сервис. Благодаря этой фишке kubernetes, вам (в большинстве случаев) не потребуется модифицировать приложения,
для реализации механизма service discovery при горизонтальном масштабировании. Kubernetes автоматически выделит
каждому поду свой IP адресс и одно DNS имя для доступа к группе подов. Обеспечивая при этом распределение нагрузки
между подамии.

В kubernetes для сервисов выделяется отдельное адресное пространство, не пересекающееся с сетью используемой подами.

## DNS

В каждом кластере kubernetes должент быть настроен DNS, при помощи которого можно обратиться к любому поду или сервису.

Например:
* Сервис: my-svc.my-namespace.svc.cluster.local .
* Под: pod-ip-address.my-namespace.pod.cluster.local .
* Под, созданный при помощи deployment: pod-ip-address.deployment-name.my-namespace.svc.cluster.local .

Более подробно про реализацию DNS в kubernetes можно почитать и посмотреть у [меня на сайте](https://www.kryukov.biz/kubernetes/dns-i-kubernetes/).

## Network Policy

Network Policy - это основной инструмент защиты сети Kubernetes. Политика позволяет ограничивать сетевой трафик в 
кластере.

В обычных сетях, защита строится на организации топологии сетевых устройств (рутеры, коммутаторы, фаерволы) и связанную
с ними конфигурацию. Добавление новых приложений часто требует дополнительное проектирование сети, конфигурацию
сетевых устройств. Что занимает достаочно много времени.

В кластере kubernetes определяется плоская сеть, в которой каждый под может взаимодействовать с другими подами кластера.
Достаточно знать IP адрес соотвествующего пода. Такой подход упрощает проектирвание сети.

В плоской сети безопасность не определяется топологией сети (её гранцами), а определяется с помощью сетевых политик.
В свою очередь, политики не зависят от топологии сети. Они работают на уровне меток (labels). При помощи селекторов 
мы можем определять какие поды могут взаимодействовть с выбранными подами, при этом не опираясь на IP адреса подов, 
которые в процессе работы кластера могут меняться.

В своей работе вы можете использовать стандартные возможности Network Policy kubernetes. А так же расширенные возможности,
которые предоставляет Calico.

## eBPF

eBPF - extended Berkeley Packet Filter.

eBPF - это виртуальная машина, встроенная в ядро Linux. Она позволяет загружать небольшие программы в ядро и прикреплять 
их к хукам, которые запускаются при наступлении какого-либо события.

[Dataplane Calico](https://docs.projectcalico.org/about/about-ebpf) может подключаться к хукам tc на каждом интерфейсе 
Calico, а так же к интерфейсам хоста. Такая возможность позволяет пропускать сетевой трафик мимо стандартных сетевых 
слоев Linux. Например минуя правила iptables, что позволяет увеличить скорость проходжения сетевых пакетов. Или 
использовать альтернативные инструменты для управления трафиком.

Более детальное описание можно найти на моем сайте: https://www.kryukov.biz/kubernetes/set-kubernetes-teoriya/

Видео: https://youtu.be/Xo14qjvbCmU